## Изменение области видимости переменных

Если же мы хотим изменить в локальной функции глобальную переменную, а не определить локальную, то необходимо использовать ключевое слово global:

```python
name = "Илья"

def say_hi():
    name = "Иван"  # скрываем значение глобальной переменной
    print("Привет,", name)

def say_bye():
    print("Пока,", name)


say_hi()
say_bye()
```

>Привет, Иван

>Пока, Илья

```python

def say_hi():
    global name
    name = "Иван"  # скрываем значение глобальной переменной
    print("Привет,", name)

```

Результат:
Привет, Иван
Пока, Иван


## nonlocal


Выражение `nonlocal` прикрепляет идентификатор к переменной из ближайщего окружающего контекста (за исключением глобального контекста). 

Обычно nonlocal применяется во вложенных функциях, когда надо прикрепить идентификатор за переменной или параметром окружающей внешней функции. 

Рассмотрим ситуацию, где это выражение может пригодиться:

```python
x = 0
def outer():
    x = 1
    def inner():
        x = 2
        print("inner:", x)
 
    inner()
    print("outer:", x)
 
outer()
print("global:", x)   

# inner: 2
# outer: 1
# global: 0
```

А теперь представим, что внутри функции inner мы хотели бы работать с переменной x, объявленной уровнем выше, то есть, в функции outer. 

Для этого в локальной области этой функции следует прописать ключевое слово nonlocal и указать переменную, которую следует взять из внешней области видимости:

>nonlocal x

```python
x = 0
def outer():
    x = 1

    def inner():
        nonlocal x
        x = 2
        print("inner:", x)

    inner()
    print("outer:", x)


outer()
print("global:", x)

# inner: 2
# outer: 2
# global: 0
```

Теперь строка x = 2 будет означать изменение переменной x в функции outer и при запуске программы мы получили соответсвующие результаты


Но так можно делать только с локальными переменными. 
С глобальной работать не будет. Если мы пропишем строчку

> nonlocal x

в функции outer, то возникнет ошибка, т.к. уровнем выше находится уже глобальная область. 

Здесь, вместо nonlocal следует уже использовать global:
```python
global x
```
а `nonlocal` в `inner` убрать, иначе опять же получится ссылка на глобальную переменную.

Теперь вы знаете, что такое глобальные и локальные переменные, как к ним обращаться и как использовать ключевые слова global и nonlocal. 